/**
 * name: http服务
 * describe: 对http请求做统一处理, 
 * 
 * ****添加修复***：请求参数与jquery的ajax传法一样，保证后端才能取到值（否则就要后端修改接收方法）。
 * 
 */
import {Injectable}    from '@angular/core';
import {Http, Response, URLSearchParams}   from '@angular/http';
import 'rxjs/add/operator/toPromise';

declare var Headers: any;

@Injectable()
export class RequstService {

  constructor(private http: Http) {
  }

  /**
   * 统一发送请求
   * @param params
   * @returns {Promise<{success: boolean, msg: string}>|Promise<R>}
   */
  public request(params: any): any {
    if(params['data'] && !(params['data'] instanceof Object)){
      console.error("form RequstService.request(....) 接口请求参数中若有data项，data必须为json对象");
      return;
    }
    // POST请求（参数、返回值类型都是任意类型）
    if ((params['type'] || '').toLowerCase() == 'post') {
      return this.post(params['url'], params['data']);
    } else { // 其他请求
      return this.get(params['url'], params['data']);
    }
  }

  /**
   * get请求
   * @param url 接口地址
   * @param params 参数
   * @returns {Promise<R>|Promise<U>}
   */
  private get(url: string, params: any): any {
    return this.http.get(url, { search: this.getFormData(params).toString() } )
      .toPromise()
      .then(this.handleSuccess)
      .catch(res => this.handleError(res));
  }

  /**
   * post请求
   * @param url 接口地址
   * @param params 参数
   * @returns {Promise<R>|Promise<U>}
   */
  private post(url: string, params: any) {

    return this.http.post(url, this.getFormData(params), {
      headers: this.getHeader()
    })
      .toPromise()
      .then(this.handleSuccess)
      .catch(res => this.handleError(res));
  }

  /**
   * 预设header
   * @param res
   * @returns 预设headers
 */
  private getHeader(){
    var headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    headers.append("Accept", "application/json");
    return headers;
  }

  /**
   * 请求参数json转换
   * @param reqData: Object
   * @returns
   */
  private getFormData(data){
    const formData = new URLSearchParams();
    for(var key in data){
      formData.append(key, data[key]);
    }
    return formData;
  }

  /**
   * 处理请求成功
   * @param res
   * @returns {{data: (string|null|((node:any)=>any)
 */
  private handleSuccess(res: Response) {

    let body = res["_body"];

    if (body) { // 有数据返回

      //如果请求成功以后需要对不同的数据（例如code不同）给予不同的处理，就在此处添加
      //.......

      return res.json();
      
    }
    else { // 无数据返回
      return {msg: "接口无任何数据返回"};
    }
  }

  /**
   * 处理请求错误
   * @param error
   * @returns {void|Promise<string>|Promise<T>|any}
   */
  private handleError(error) {
    console.log(error);
    let msg = '请求失败';
    if (error.status == 400) {
      console.log('请求参数正确');
    }
    if (error.status == 404) {
      console.error('请检查路径是否正确');
    }
    if (error.status == 500) {
      console.error('请求的服务器错误');
    }
    console.log(error);
    return {success: false, msg: msg};
  }
}


//用法：

    //在某个组件中，注入该服务，然后测试...
    /*

    this.RequstService.request({
      url: "http://120.78.231.106:8080/gs-cloud-web-sso/member/login",
      type: "post",
      data: {
        phone:18285159067,
        pwd:123456
      }
    }).then(result => {
      console.log(result);//打印返回的数据
    });

    */

